package demo06;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/*
 *  线程池：JDK1.5+提供支持
 *  java.util.concurrent.Executors：线程的工厂类，用于生产线程池
 *      Executors下的静态方法：
 *          public static ExecutorService newFixedThreadPool(int nThreads)：创建一个可重用固定线程数的线程数
 *              参数 int nThreads：创建的线程池中包含的最大线程数
 *              返回值 ExecutorService接口：返回的是ExecutorService接口的实现类对象，可以使用ExecutorService接口接收（面向接口编程）
 *  java.util.concurrent.ExecutorService：线程池接口
 *      ExecutorService下的常用方法：
 *          Future<?> submit(Runnable task)：提交一个Runnable任务用于执行，用于从线程池中获取线程，调用start方法，执行线程任务
 *          void shutdown()：用于关闭/销毁线程池
 *  线程池使用步骤：
 *      1. 使用线程池的工厂类Executors的静态方法newFixedThreadPool创建一个指定线程数量的线程池
 *      2. 创建一个实现Runnable接口的类，重写run方法，布置线程任务
 *      3. 调用ExecutorService中的方法submit，传递参数线程任务（实现类），开启线程，执行其中的run方法
 *      4. 调用ExecutorService中的方法shutdown销毁线程池
 */
public class Demo01ThreadPool {
    public static void main(String[] args) {
        // 1. 使用线程池的工厂类Executors的静态方法newFixedThreadPool创建一个指定线程数量的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        // 3. 调用ExecutorService中的方法submit，传递参数线程任务（实现类），开启线程，执行其中的run方法
        executorService.submit(new RunnableImpl()); // 创建新线程：pool-1-thread-1
        executorService.submit(new RunnableImpl()); // 创建新线程：pool-1-thread-2
        // 线程会一直开启，线程使用完毕后，会自动把线程归还给线程池，线程可以继续使用
        executorService.submit(new RunnableImpl()); // 创建新线程：pool-1-thread-1
        executorService.submit(new RunnableImpl()); // ...

        // 4. 调用ExecutorService中的方法shutdown销毁线程池
        executorService.shutdown();

        executorService.submit(new RunnableImpl()); // 抛出RejectedExecutionException线程池拒绝执行异常，线程池内的线程已悉数销毁，不可使用
    }
}
